package sv.gob.mh.dgii.service.ruc;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.springframework.stereotype.Service;
import sv.gob.mh.dgii.common.Utils;
import sv.gob.mh.dgii.model.pojos.ruc.QueryRcRuc;
import sv.gob.mh.dgii.model.pojos.ruc.Tramite;


@Service
public class TramiteBuilderImpl implements TramiteBuilder {
	
	private HashMap<String,Boolean> combinaciones = new HashMap<String, Boolean>();
	
	public TramiteBuilderImpl() {
		combinaciones.put("0000000", false);
		combinaciones.put("0000001", true);
		combinaciones.put("0000010", false);
		combinaciones.put("0000011", true);
		combinaciones.put("0000100", false);
		combinaciones.put("0000101", true);
		combinaciones.put("0000110", false);
		combinaciones.put("0000111", true);
		combinaciones.put("0001000", false);
		combinaciones.put("0001001", true);
		combinaciones.put("0001010", false);
		combinaciones.put("0001011", true);
		combinaciones.put("0001100", false);
		combinaciones.put("0001101", false);
		combinaciones.put("0001110", false);
		combinaciones.put("0001111", false);
		combinaciones.put("0010000", true);
		combinaciones.put("0010001", false);
		combinaciones.put("0010010", false);
		combinaciones.put("0010011", false);
		combinaciones.put("0010100", false);
		combinaciones.put("0010101", false);
		combinaciones.put("0010110", false);
		combinaciones.put("0010111", false);
		combinaciones.put("0011000", false);
		combinaciones.put("0011001", false);
		combinaciones.put("0011010", false);
		combinaciones.put("0011011", false);
		combinaciones.put("0011100", false);
		combinaciones.put("0011101", false);
		combinaciones.put("0011110", false);
		combinaciones.put("0011111", false);
		combinaciones.put("0100000", true);
		combinaciones.put("0100001", false);
		combinaciones.put("0100010", false);
		combinaciones.put("0100011", false);
		combinaciones.put("0100100", false);
		combinaciones.put("0100101", false);
		combinaciones.put("0100110", false);
		combinaciones.put("0100111", false);
		combinaciones.put("0101000", false);
		combinaciones.put("0101001", false);
		combinaciones.put("0101010", false);
		combinaciones.put("0101011", false);
		combinaciones.put("0101100", false);
		combinaciones.put("0101101", false);
		combinaciones.put("0101110", false);
		combinaciones.put("0101111", false);
		combinaciones.put("0110000", false);
		combinaciones.put("0110001", false);
		combinaciones.put("0110010", false);
		combinaciones.put("0110011", false);
		combinaciones.put("0110100", false);
		combinaciones.put("0110101", false);
		combinaciones.put("0110110", false);
		combinaciones.put("0110111", false);
		combinaciones.put("0111000", false);
		combinaciones.put("0111001", false);
		combinaciones.put("0111010", false);
		combinaciones.put("0111011", false);
		combinaciones.put("0111100", false);
		combinaciones.put("0111101", false);
		combinaciones.put("0111110", false);
		combinaciones.put("0111111", false);
		combinaciones.put("1000000", false);		
		combinaciones.put("1000001", true);
		combinaciones.put("1000010", false);
		combinaciones.put("1000011", false);
		combinaciones.put("1000100", false);
		combinaciones.put("1000101", false);
		combinaciones.put("1000110", false);
		combinaciones.put("1000111", false);
		combinaciones.put("1001000", false);
		combinaciones.put("1001001", false);
		combinaciones.put("1001010", false);
		combinaciones.put("1001011", false);
		combinaciones.put("1001100", false);
		combinaciones.put("1001101", false);
		combinaciones.put("1001110", false);
		combinaciones.put("1001111", false);
		combinaciones.put("1010000", false);
		combinaciones.put("1010001", false);
		combinaciones.put("1010010", false);
		combinaciones.put("1010011", false);
		combinaciones.put("1010100", false);
		combinaciones.put("1010101", false);
		combinaciones.put("1010110", false);
		combinaciones.put("1010111", false);
		combinaciones.put("1011000", false);
		combinaciones.put("1011001", false);
		combinaciones.put("1011010", false);
		combinaciones.put("1011011", false);
		combinaciones.put("1011100", false);
		combinaciones.put("1011101", false);
		combinaciones.put("1011110", false);
		combinaciones.put("1011111", false);
		combinaciones.put("1100000", false);
		combinaciones.put("1100001", false);
		combinaciones.put("1100010", false);
		combinaciones.put("1100011", false);
		combinaciones.put("1100100", false);
		combinaciones.put("1100101", false);
		combinaciones.put("1100110", false);
		combinaciones.put("1100111", false);
		combinaciones.put("1101000", false);
		combinaciones.put("1101001", false);
		combinaciones.put("1101010", false);
		combinaciones.put("1101011", false);
		combinaciones.put("1101100", false);
		combinaciones.put("1101101", false);
		combinaciones.put("1101110", false);
		combinaciones.put("1101111", false);
		combinaciones.put("1110000", false);
		combinaciones.put("1110001", false);
		combinaciones.put("1110010", false);
		combinaciones.put("1110011", false);
		combinaciones.put("1110100", false);
		combinaciones.put("1110101", false);
		combinaciones.put("1110110", false);
		combinaciones.put("1110111", false);
		combinaciones.put("1111000", false);
		combinaciones.put("1111001", false);
		combinaciones.put("1111010", false);
		combinaciones.put("1111011", false);
		combinaciones.put("1111100", false);
		combinaciones.put("1111101", false);
		combinaciones.put("1111110", false);
		combinaciones.put("1111111", false);
	}
	
	public List<Tramite> tramitesPermitidos(QueryRcRuc ruc) throws Exception {
		
		List<Tramite> tramites = new ArrayList<Tramite>();
		
		
		if(Utils.isNullOrEmpty(ruc.getRcRuc().getFtermino())) {
			tramites.add(Tramite.TERMINO_NIT);			
			tramites.add(Tramite.REPOSICION_NIT);
			tramites.add(Tramite.MODIFICACION);
			
			if(Utils.isNullOrEmpty(ruc.getNrc())) {
				tramites.add(Tramite.INSCRIPCION_NRC);
			}else {
				//Si el nrc esta activo le permito reposicion y termino
				tramites.add(Tramite.REPOSICION_NRC);
				tramites.add(Tramite.TERMINO_NRC);
			}
			
		}else {
			tramites.add(Tramite.RESTITUCION);
		}
		
		//printBin("",7); 
		
		return tramites;
	}

	/**
	 * Determina en base a la cadena de texto que representa los tramites
	 * si existe un tramite relacionado a NRC
	 * @param tramites
	 * @return
	 */
	public boolean isNRC(String tramites) {
		return (tramites.charAt(3)=='1' || tramites.charAt(4) == '1');	
	}
	
	public HashMap<String, Boolean> getCombinaciones() {
		return combinaciones;
	}

	public void setCombinaciones(HashMap<String, Boolean> combinaciones) {
		this.combinaciones = combinaciones;
	}

	
	
	
}
